(function ($) {
  $.fn.extend({
    leanModal: function (options) {
      var defaults = {
        opacity: 0.7,
        closeButton: null
      };
      var overlay = $('<div id="lean_overlay"></div>');

      $('BODY').append(overlay);

      options = $.extend(defaults, options);

      function close_modal(id) {
        $('#lean_overlay').fadeOut(200);
        $(id).css({ 'display': 'none' });
      }

      return this.each(function () {
        var opts = options;

        $(this).click(function (e) {
          var modal_id = $(this).data('target') ? $(this).data('target') :  $(this).attr('href');
          var $overlay = $('#lean_overlay');

          $overlay.click(function () {
            close_modal(modal_id);
          });

          $(opts.closeButton).click(function (e) {
            e.preventDefault();
            close_modal(modal_id);
          });

          $(document).keydown(function (e){
            if (e.keyCode === 27) {
              close_modal(modal_id);
            }
          });

          var modal_height = $(modal_id).outerHeight();
          var modal_width = $(modal_id).outerWidth();

          $overlay
            .css({
              'display': 'block',
              'opacity': 0
            })
            .fadeTo(200, opts.opacity);

          $(modal_id).css({
            'z-index': 1e3,
            'display': 'block',
            'position': 'fixed',
            'top': 50 + '%',
            'left': 50 + '%',
            'margin-top': -(modal_height / 2) + 'px',
            'margin-left': -(modal_width / 2) + 'px',
            'opacity': 0
          });

          $(modal_id).fadeTo(200, 1);
          e.preventDefault();
        });
      });
    }
  });
})(jQuery);